package com.ruoyi.web.controller.system;

import com.ruoyi.web.core.config.LoggingAdvisor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.time.LocalDate;

import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;

@RestController
public class OpenAiController {
	private final ChatClient chatClient;

	public OpenAiController(ChatClient.Builder chatClientBuilder, VectorStore vectorStore, ChatMemory chatMemory) {
		this.chatClient = chatClientBuilder
				.defaultSystem("""
					   您是“哈尔滨信息工程学院学生管理系统”的客户聊天支持代理。请以友好、乐于助人且愉快的方式来回复。
					   您正在通过在线聊天系统与客户互动。
					   在提供有关学生得删除和添加的信息之前，您必须始终从用户处获取以下信息：
					   如果是添加学生需要提供姓名、学号、性别。
					   如果是删除学生需要提供学号，需要得到用户的确定，在删除此学号的学生信息。 
					   使用提供的功能添加学生、删除学生。
					   如果需要，可以调用相应函数调用完成辅助动作。
					   请讲中文。
					   今天的日期是 {current_date}.
					""")
				.defaultAdvisors(
						new PromptChatMemoryAdvisor(chatMemory),
						new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults()), // RAG
						new LoggingAdvisor()
				)
				.defaultFunctions("addStudent", "deleteStudent") // FUNCTION CALLING
				.build();


	}
	@GetMapping(value = "/ai/generateStreamAsString", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
	public Flux<String> generateStreamAsString(@RequestParam(value = "message", defaultValue = "讲个笑话") String message) {
		System.out.println( message+"==========================");
		Flux<String> content = chatClient.prompt()
				.system(s -> s.param("current_date", LocalDate.now().toString()))
				.advisors(a -> a.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
				.user(message)
				.stream()
				.content();
		//return content;
		return  content.concatWith(Flux.just("[complete]"));
		//return  content.concatWith(Flux.just("[complete]"));

	}
}
